package ar.edu.utn.frsf.tpae.a2012.g04.presentacion.controller;

import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ar.edu.utn.frsf.tpae.a2012.g04.dominio.CajaAhorro;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.CuentaCorriente;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Pago;
import ar.edu.utn.frsf.tpae.a2012.g04.presentacion.util.ServiceLocator;
import ar.edu.utn.frsf.tpae.a2012.g04.service.CajaAhorroService;
import ar.edu.utn.frsf.tpae.a2012.g04.service.ClienteService;
import ar.edu.utn.frsf.tpae.a2012.g04.service.CuentaCorrienteService;

public class MovimientosBean  {

	private Cuenta cuenta;
	private List<Cuenta> cuentas;
	private List<Movimiento> movimientos;
	
	
	public String cargarPagina() {
		String id =  FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get("id");
		Integer nroCuenta = new Integer(id);
		FacesContext context = FacesContext.getCurrentInstance();
		ClienteBean bean = (ClienteBean) context.getApplication().evaluateExpressionGet(context, "#{clienteBean}", ClienteBean.class);
		ClienteService serviceCliente = ServiceLocator.getClienteService();
		cuentas = serviceCliente.listarCuentas(bean.getCliente());
		for(Cuenta cta: cuentas) {
			if (cta.getNumero() == nroCuenta) {
				cuenta = cta;			
				break;
			}
		}
		if (cuenta != null) {
			/****************CARGO LOS MOVIMIENTOS DE LA CUENTA*************/
			CuentaCorrienteService cuentaService= ServiceLocator.getCuentaCorrienteService();
			 CajaAhorroService cajaAhorroService= ServiceLocator.getCajaAhorroServicio();

			if(cuenta instanceof CuentaCorriente){
				
				movimientos=cuentaService.verMovimientos((CuentaCorriente)cuenta);
			}
			if(cuenta instanceof CajaAhorro){
				
				movimientos=cajaAhorroService.verMovimientos((CajaAhorro)cuenta);
			}
			
			/***************************************************************/	
			
			return "verMovimientos";
		}
		return null;
	}
	
	
	public String exportar() {

		String fileName = "Movimientos_Cuenta_" + cuenta.getNumero() + ".csv";
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        try {
	        response.reset();
	        response.setContentType("text/comma-separated-values");
	        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
	        OutputStream output = response.getOutputStream();
	        crearArchivoCSV(output);
        	output.flush();
        	output.close();
        } catch (IOException e) {
        	ResourceBundle bundle = ResourceBundle.getBundle("mensajes", context.getViewRoot().getLocale());
        	context.addMessage(null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle
							.getString("error.creacionarchivo"), ""));
		}
        context.responseComplete();
        
		return null;
	}
	
	private void crearArchivoCSV(OutputStream output) throws IOException {
		List<String> strings = new ArrayList<String>();
        
		for (Movimiento m : movimientos ) {
			if(m instanceof Pago){
				Pago p= (Pago)m;
				strings.add(p.getFecha().toString() + ";" + p.getTipo()
						+ ";" + p.getComentario()+ ";" + p.getMonto() + "\n");
			}
			
        }
        
        for (String s : strings) {
				output.write(s.getBytes());
        }
		
	}
	public String cerrarSession(){
		FacesContext context = FacesContext.getCurrentInstance();

		ExternalContext externalContext = context.getExternalContext();

		Object session = externalContext.getSession(false);

		HttpSession httpSession = (HttpSession) session;

		httpSession.invalidate();
		return "irlogin";
	}
	
	public List<Cuenta> getCuentas() {
		return cuentas;
	}


	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}


	public List<Movimiento> getMovimientos() {
		return movimientos;
	}


	public void setMovimientos(List<Movimiento> movimientos) {
		this.movimientos = movimientos;
	}


	public Cuenta getCuenta() {
		return cuenta;
	}
	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}
}
